home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / t_os / rbowmous / rm.asm next >
Assembly Source File  |  1991-10-18  |  4KB  |  243 lines

  1. ;=======================================================
  2. ;    RM.EXP (Rainbow Mouse)        1991.7/30    
  3. ;=======================================================
  4.  
  5.         .386p
  6.  
  7. EGB_WORK_SIZE    equ    600h
  8. MOUSE_WORK_SIZE    equ    1000h
  9.  
  10. EGB        macro    no
  11.         mov    ah,no
  12.         call    fword ptr fs:[20h]
  13.         endm
  14.  
  15. MOUSE        macro    no
  16.         mov    ah,no
  17.         call    fword ptr fs:[40h]
  18.         endm
  19.  
  20. DGROUP        group    DATA,BSS
  21.  
  22. CODE        segment    public use32
  23.         assume    cs:CODE,ds:DGROUP,gs:DGROUP,ss:SSEG
  24. entry:
  25.         cld
  26.         mov    ax,0110h        ;TBIOS sel
  27.         mov    fs,ax
  28.         call    init_mouse
  29.         mov    ax,0104h        ;VRAM sel
  30.         mov    es,ax
  31.         call    init_screen
  32. ;-----------------------------------------------
  33. main_lp:
  34. ;wait VSYNC end
  35.         mov    al,30            ;CRTC reg#=30
  36.         mov    dx,440h
  37.         out    dx,al
  38.         add    dx,3
  39. vsync_e_lp:    in    al,dx
  40.         test    al,80h
  41.         je    short vsync_e_lp
  42.  
  43. ;------- change -------
  44.         mov    ecx,7
  45.         mov    esi,offset btm_mouse_pos
  46.  
  47. chg_pos_lp:    lodsd
  48.         mov    [esi],eax
  49.         sub    esi,8
  50.         loop    chg_pos_lp
  51.  
  52.         call    fword ptr fs:[48h]    ;mouse sense routine
  53.  
  54.         MOUSE    03h
  55.         test    ch,02h
  56.         jne    finish
  57.  
  58.         test    ch,01h
  59.         je    short pos2adrs
  60.         add    [mouse_color],11111111h
  61.         jnb    short pos2adrs
  62.         mov    [mouse_color],99999999h
  63. pos2adrs:
  64.         movzx    edi,bx
  65.         shl    edi,9        ;y*512
  66.         movzx    edx,dx
  67.         shr    edx,1        ;x/2
  68.         add    edi,edx
  69.         add    edi,40000h
  70.         mov    [top_mouse_pos],edi
  71.  
  72. ;wait VSYNC start
  73.         mov    al,30            ;CRTC reg#=30
  74.         mov    dx,440h
  75.         out    dx,al
  76.         add    dx,3
  77. vsync_s_lp:    in    al,dx
  78.         test    al,80h
  79.         jne    short vsync_s_lp
  80.  
  81. ;------- clear -------
  82.         mov    edi,[clr_mouse_pos]
  83.  
  84.         mov    ecx,16
  85.         xor    eax,eax
  86.         align    4
  87. clr_ms_csr_lp:    stosd
  88.         stosd
  89.         add    edi,512-8
  90.         loop    clr_ms_csr_lp
  91.  
  92. ;------- write -------
  93.         mov    ecx,7
  94.         mov    ebx,offset btm_mouse_pos
  95.         mov    ebp,[mouse_color]
  96.  
  97.         align    4
  98. wrt_ms_lplp:    push    ecx
  99.         mov    edi,[ebx]
  100.         mov    ecx,16
  101.         mov    esi,offset ms_csr_data
  102.         align    4
  103. wrt_ms_csr_lp:    lodsd
  104.         mov    edx,eax
  105.         not    edx
  106.         and    edx,es:[edi]        ;くり抜き
  107.         and    eax,ebp            ;色セット
  108.         or    eax,edx
  109.         stosd
  110.  
  111.         lodsd
  112.         mov    edx,eax
  113.         not    edx
  114.         and    edx,es:[edi]        ;くり抜き
  115.         and    eax,ebp            ;色セット
  116.         or    eax,edx
  117.         mov    es:[edi],eax
  118.  
  119.         add    edi,512-4
  120.         loop    wrt_ms_csr_lp
  121.  
  122.         pop    ecx
  123.         sub    ebx,4
  124.         add    ebp,11111111h
  125.         jnb    short color_ok
  126.         mov    ebp,99999999h
  127. color_ok:
  128.         loop    wrt_ms_lplp
  129.  
  130.         jmp    main_lp
  131. ;-----------------------------------------------
  132. finish:
  133.         mov    edi,offset egb_work
  134.         mov    ecx,EGB_WORK_SIZE
  135.         EGB    00h            ;init EGB
  136.  
  137.         MOUSE    01h            ;end MOUSE
  138.  
  139.         mov    ax,4c00h
  140.         int    21h
  141. ;-----------------------------------------------
  142. init_screen    proc    near
  143.  
  144.         mov    edi,offset egb_work
  145.         mov    ecx,EGB_WORK_SIZE
  146.         EGB    00h            ;init EGB
  147.  
  148.         mov    al,1
  149.         mov    edx,3
  150.         EGB    06h            ;set priority
  151.  
  152. ;make screen
  153.         xor    edi,edi
  154.         mov    ecx,(512/4)*40
  155.         mov    eax,77777777h
  156.         rep stosd
  157.  
  158.         mov    ecx,(512/4)*440
  159.         mov    eax,88888888h
  160.         rep stosd
  161.  
  162.         ret
  163. init_screen    endp
  164. ;-----------------------------------------------
  165. init_mouse    proc    near
  166.  
  167. ;clear mouse_work
  168.         mov    edi,offset mouse_work
  169.         mov    ecx,MOUSE_WORK_SIZE/4
  170.         xor    eax,eax
  171.         rep stosd
  172.  
  173.         mov    edi,offset mouse_work
  174.         mov    ecx,MOUSE_WORK_SIZE
  175.         MOUSE    00h            ;init MOUSE
  176.  
  177. ;set mouse window
  178.         xor    dx,dx
  179.         mov    bx,639            ;x
  180.         MOUSE    07h
  181.         mov    bx,479            ;y
  182.         MOUSE    08h
  183.  
  184.         mov    dx,320
  185.         mov    bx,240
  186.         MOUSE    04h            ;set mouse_pos
  187.  
  188. ;init mouse_pos
  189.         mov    ecx,8
  190.         mov    edi,offset top_mouse_pos
  191.         mov    eax,1e0a0h+40000h
  192.         rep stosd
  193.  
  194.         mov    [mouse_color],99999999h
  195.  
  196.         ret
  197. init_mouse    endp
  198.  
  199. CODE        ends
  200. ;=======================================================
  201. DATA        segment    public use32
  202.  
  203. ms_csr_data    dd    0ffffffffh,000000000h
  204.         dd    00fffffffh,000000000h
  205.         dd    000ffffffh,000000000h
  206.         dd    0000fffffh,000000000h
  207.         dd    000ffffffh,000000000h
  208.         dd    00fff0fffh,000000000h
  209.         dd    0fff000ffh,000000000h
  210.         dd    0ff00000fh,00000000fh
  211.         dd    0f0000000h,0000000ffh
  212.         dd    000000000h,000000fffh
  213.         dd    000000000h,00000fff0h
  214.         dd    000000000h,000000f00h
  215.         dd    000000000h,000000000h
  216.         dd    000000000h,000000000h
  217.         dd    000000000h,000000000h
  218.         dd    000000000h,000000000h
  219.  
  220. DATA        ends
  221. ;=======================================================
  222. BSS        segment    public use32
  223.  
  224. top_mouse_pos    dd    ?
  225.         dd    5 dup(?)
  226. btm_mouse_pos    dd    ?
  227. clr_mouse_pos    dd    ?
  228.  
  229. mouse_color    dd    ?
  230.  
  231. egb_work    db    EGB_WORK_SIZE dup(?)
  232. mouse_work    db    MOUSE_WORK_SIZE dup(?)
  233.  
  234. BSS        ends
  235. ;=======================================================
  236. SSEG        segment    stack use32
  237.  
  238.         db    1000h dup(?)
  239.  
  240. SSEG        ends
  241. ;=======================================================
  242.         end    entry
  243.